package network2;

import javax.sound.sampled.Port;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    private Socket socket = null;
    public TcpEchoClient(String serverIp, int serverPort) throws IOException {
        //tcp客户端中的socket和这里的socket不是一个socket对象，就像是打电话通信的两个电话
        //客户端和服务器的概念是相对的，主要是看是主动发起请求的一方还是被动接收请求的一方，如果是
        //主动发起请求的一方就是客户端，被动结束请求并计算响应的一方就是服务器

        //这个对象构造过程，就会触发TCP建立连接的过程，如果
        //客户端没有这个socket，此时服务器就会阻塞在accept方法这里，
        socket = new Socket(serverIp, serverPort);
    }
    public void start() {
        System.out.println("客户端启动：");
        Scanner scanner = new Scanner(System.in);
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            //此时发送数据和接收响应就是根据socket对象来操作，socket对象中就有这个
            //电话的听筒和麦克风，所以在socket对象中获取输入流和输出流即可
            while (true) {
                //1. 先从键盘上读取用户输入的内容
                System.out.print("> ");
                String request = scanner.next();
                if (request.equals("exit")) {
                    System.out.println("goodbye");
                    break;
                }
                //2.把读取到的内容构造成请求，发动给服务器
                /*此时输出流对象只是读入一个流对象，并不是读的是字符串对象
                * 所以就用PrintWriter来包装一下，此时就变成一个字符串了，*/
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(request);//此时就把控制台的数据构造成了一个请求
                //然后发送出去了
                //此处加一个flush，确保请求就是真正的发送出去了，不是还呆在缓冲区
                printWriter.flush();
                //3.读取服务器的响应
                Scanner respScanner = new Scanner(inputStream);
                //注意上述代码不是System.in,此时应该是从socket对象中的输出流来读取响应
                String response = respScanner.next();
                //4.把响应的内容显示到界面上
                System.out.println(response);

                /*PrintWriter对应的就是如果是写文件，println就把outputStream写入文件中了，
                * println也可以用来写文件，如果outputStream是一个socket对象，此时就通过网卡发送出去了*/
        }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient = new TcpEchoClient("127.0.0.1", 9090);
        tcpEchoClient.start();
    }
}
